systemisches Beispiel rund um Uebergabestellen¶
Logging¶
[1]:
import os
import logging
logger = logging.getLogger()
logFileName= r"BWV.log"
loglevel = logging.DEBUG
logging.basicConfig(filename=logFileName
,filemode='w'
,level=loglevel
,format="%(asctime)s ; %(name)-60s ; %(levelname)-7s ; %(message)s")
fileHandler = logging.FileHandler(logFileName)
logger.addHandler(fileHandler)
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logging.Formatter("%(levelname)-7s ; %(message)s"))
consoleHandler.setLevel(logging.INFO) # ggf. DEBUG/WARNING/ERROR
logger.addHandler(consoleHandler)
import pandas as pd
import geopandas as gpd
import networkx as nx
import glob
import re
import numpy as np
import folium
from folium.plugins import HeatMap
import doctest
INFO ; Note: NumExpr detected 12 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8.
INFO ; NumExpr defaulting to 8 threads.
Modelldatei¶
[2]:
dbFilename="BWV"
PT3S (Python Module für SIR 3S’ MX und SIR 3S’ DB)¶
nachfolgende Zeile mit # deaktivieren wenn aktuelle Version bereits installiert oder kein Update gewünscht
[3]:
!pip install PT3S -U --no-deps
Requirement already satisfied: PT3S in c:\users\wolters\appdata\local\anaconda3\lib\site-packages (90.14.15.0.dev1)
[4]:
try:
from PT3S import dxAndMxHelperFcts
except:
import dxAndMxHelperFcts
Modell und Ergebnisse lesen¶
[5]:
m=dxAndMxHelperFcts.readDxAndMx(dbFile=os.path.join('.',dbFilename+'.db3')
#,forceSir3sRead=True
#,preventPklDump=True
)
INFO ; PT3S.dxAndMxHelperFcts.readDxAndMx: .\BWV-dx.pkl newer than dbFile and therefore read ...
INFO ; PT3S.dxAndMxHelperFcts.readDxAndMx: .\BWV-mx-WDBWV_B1_V0_BZ1_M_1_0_1_1_MX1.pkl newer than mxFile and therefore read ...
INFO ; PT3S.dxAndMxHelperFcts.readDxAndMx: .\BWV-m.pkl exists newer than M-1-0-1.1.MX1 and is therefore read ...
Shapes¶
lesen¶
[6]:
shapes={}
for shpFile in glob.glob(r".\GIS Daten\*.shp"):
gdf=gpd.read_file(shpFile)
shpFilename=os.path.basename(shpFile)
shpFilename,tail=os.path.splitext(shpFilename)
shapes[shpFilename]=gdf
print("{:s}: Objekte: {:d} Attribute: {:d}:".format(shpFilename,gdf.shape[0],gdf.shape[1]))
print(sorted(gdf.columns.to_list()))
AA_T_B_BAUTEIL: Objekte: 9654 Attribute: 20:
['ANLAGENID_', 'ARMATURSTE', 'EIGENSCHAF', 'EINGEARBEI', 'FUNKTION_B', 'HOEHENIND1', 'HOEHENIND2', 'HOEHENINDE', 'H_SYSTEM_1', 'H_SYSTEM_R', 'H_SYSTEM_U', 'LEITUNGSNR', 'PK', 'RNB_RELEVA', 'ROK', 'ROK_ABGEHE', 'STATUS', 'UEBEREICHH', 'UEBERGABES', 'geometry']
AA_T_B_LEITUNGSABSCHNITT_ALL: Objekte: 10070 Attribute: 17:
['ABSCHNITTS', 'ANLASS_VER', 'BETRIEBSST', 'DATUM_INBE', 'DN', 'GRUND_VERL', 'KATEGORIE', 'LAGEINDEX', 'LEITUNGSNR', 'MATERIAL', 'NENNDRUCKS', 'PK', 'PUMPENDRUC', 'RNB_RELEVA', 'STATUS', 'geometry', 'pk_string']
B_UEBERGABESTELLE: Objekte: 452 Attribute: 16:
['BEMERKUNG', 'FUNKTION_B', 'MIS_BEHAEL', 'MIS_BENUTZ', 'MIS_BWVWAS', 'MIS_EIGENW', 'MIS_MISCHW', 'MIS_UGSTBE', 'MIS_UGSTID', 'MIS_UGSTN1', 'MIS_UGSTN2', 'MIS_UGSTNA', 'MITGLIEDSN', 'PK', 'STATUS', 'geometry']
sichten¶
[7]:
shpFilenameLeitungen=[key for key in shapes.keys() if re.search('LEITUNGSABSCHNITT',key) != None][0]
shpLeitungen=shapes[shpFilenameLeitungen]
[8]:
shpLeitungen['DN'].describe()
[8]:
count 10070.000000
mean 468.969712
std 399.662788
min 0.000000
25% 150.000000
50% 300.000000
75% 600.000000
max 3300.000000
Name: DN, dtype: float64
[9]:
shpLeitungen.crs
[9]:
<Projected CRS: PROJCS["Potsdam_3_Degree_GK_Zone_3",GEOGCS["GCS_Po ...>
Name: Potsdam_3_Degree_GK_Zone_3
Axis Info [cartesian]:
- [east]: Easting (metre)
- [north]: Northing (metre)
Area of Use:
- undefined
Coordinate Operation:
- name: unnamed
- method: Transverse Mercator
Datum: Deutsches_Hauptdreiecksnetz
- Ellipsoid: Bessel 1841
- Prime Meridian: Greenwich
[10]:
minWidthinPixel=.75
maxWidthinPixel=5*minWidthinPixel
facWidthinPixelDN=1/200.
mLtg=shpLeitungen[~pd.isnull(shpLeitungen['geometry'])].sort_values(by=['DN'],ascending=True).explore(column='DN'
,cmap='cool_r',vmin=shpLeitungen['DN'].quantile(.20),vmax=shpLeitungen['DN'].quantile(.80)
,style_kwds={"style_function":lambda x: {"weight":min(max(x["properties"]["DN"]*facWidthinPixelDN,minWidthinPixel),maxWidthinPixel)}}
,tiles='CartoDB Positron' #'OpenStreetMap'
,name='shpLeitungen'
)
[1]:
mLtg
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[1], line 1
----> 1 mLtg
NameError: name 'mLtg' is not defined
[12]:
shpFilenameUebergabestellen=[key for key in shapes.keys() if re.search('UEBERGABESTELLE',key) != None][0]
shpUebergabestellen=shapes[shpFilenameUebergabestellen]
[13]:
shpUebergabestellen.describe()
[13]:
| MIS_UGSTID | MIS_BWVWAS | MIS_EIGENW | MIS_BEHAEL | PK | |
|---|---|---|---|---|---|
| count | 452.000000 | 84.000000 | 84.000000 | 399.000000 | 452.000000 |
| mean | 839.000000 | 51.909524 | 48.028571 | 1814.030075 | 6995.389381 |
| std | 819.492677 | 16.515933 | 16.520608 | 3364.607982 | 4495.498042 |
| min | 1.000000 | 12.000000 | 0.000000 | 1.000000 | 170.000000 |
| 25% | 125.750000 | 42.750000 | 39.750000 | 387.500000 | 5110.750000 |
| 50% | 1064.500000 | 50.000000 | 50.000000 | 850.000000 | 5261.500000 |
| 75% | 1184.250000 | 60.250000 | 57.250000 | 2000.000000 | 5453.000000 |
| max | 7003.000000 | 100.000000 | 88.000000 | 32990.000000 | 23191.000000 |
[14]:
shpUebergabestellen[pd.isnull(shpUebergabestellen['MIS_BEHAEL'])].describe()
[14]:
| MIS_UGSTID | MIS_BWVWAS | MIS_EIGENW | MIS_BEHAEL | PK | |
|---|---|---|---|---|---|
| count | 53.000000 | 1.0 | 1.0 | 0.0 | 53.000000 |
| mean | 1449.603774 | 50.0 | 50.0 | NaN | 10442.886792 |
| std | 1626.053875 | NaN | NaN | NaN | 6505.304113 |
| min | 10.000000 | 50.0 | 50.0 | NaN | 179.000000 |
| 25% | 1038.000000 | 50.0 | 50.0 | NaN | 5230.000000 |
| 50% | 1154.000000 | 50.0 | 50.0 | NaN | 5501.000000 |
| 75% | 1272.000000 | 50.0 | 50.0 | NaN | 14794.000000 |
| max | 7003.000000 | 50.0 | 50.0 | NaN | 22568.000000 |
[15]:
gdfUe1=shpUebergabestellen[
(~pd.isnull(shpUebergabestellen['geometry']))
&
(~shpUebergabestellen['MIS_BEHAEL'].isin([0.,None,np.nan]))
]
gdfUe1["MIS_BEHAEL"].describe()
[15]:
count 399.000000
mean 1814.030075
std 3364.607982
min 1.000000
25% 387.500000
50% 850.000000
75% 2000.000000
max 32990.000000
Name: MIS_BEHAEL, dtype: float64
[16]:
minRadius=2
maxRadius=10*minRadius
facRadius=1/1000.
mUe=gdfUe1.sort_values(by=['MIS_BEHAEL'],ascending=False).explode().explore(column='MIS_BEHAEL'
,cmap='autumn_r'
,vmin=gdfUe1["MIS_BEHAEL"].quantile(.025),vmax=gdfUe1["MIS_BEHAEL"].quantile(.975)
,style_kwds={"style_function":lambda x: {
"radius":min(max(x["properties"]["MIS_BEHAEL"]*facRadius,minRadius),maxRadius)
}
}
,tiles='CartoDB Positron' #'OpenStreetMap'
,name='shpUebergabestellen'
)
[17]:
mUe
[17]:
Make this Notebook Trusted to load map: File -> Trust Notebook
[18]:
dfLonLat=gdfUe1.to_crs("EPSG:4326").geometry.get_coordinates()
dfLonLat.head()
[18]:
| x | y | |
|---|---|---|
| 0 | 8.902281 | 48.761125 |
| 1 | 8.840359 | 47.968704 |
| 2 | 9.295282 | 49.619030 |
| 3 | 9.006094 | 48.732733 |
| 4 | 8.959045 | 48.703604 |
[19]:
dfLonLatValue=pd.merge(gdfUe1,dfLonLat,left_index=True,right_index=True)[['x','y','MIS_BEHAEL']]
dfLonLatValue.head()
[19]:
| x | y | MIS_BEHAEL | |
|---|---|---|---|
| 0 | 8.902281 | 48.761125 | 2000.0 |
| 1 | 8.840359 | 47.968704 | 400.0 |
| 2 | 9.295282 | 49.619030 | 300.0 |
| 3 | 9.006094 | 48.732733 | 600.0 |
| 4 | 8.959045 | 48.703604 | 500.0 |
[20]:
dfLonLatValue['xW']=dfLonLatValue.apply(lambda row: row['x']*row['MIS_BEHAEL'],axis=1)
dfLonLatValue['yW']=dfLonLatValue.apply(lambda row: row['y']*row['MIS_BEHAEL'],axis=1)
[21]:
dfLonLatValue.mean()
[21]:
x 9.079953
y 48.871738
MIS_BEHAEL 1814.030075
xW 16493.425336
yW 88504.866735
dtype: float64
[22]:
xAvgW=dfLonLatValue['xW'].sum()/dfLonLatValue['MIS_BEHAEL'].sum()
yAvgW=dfLonLatValue['yW'].sum()/dfLonLatValue['MIS_BEHAEL'].sum()
xAvgW,yAvgW
[22]:
(9.092145473005848, 48.78908456141424)
[23]:
heatMapData = [[row['y'],row['x'],row['MIS_BEHAEL']] for index, row in dfLonLatValue.iterrows()]
[24]:
heatMapData[:3]
[24]:
[[48.761125384297436, 8.902280702401265, 2000.0],
[47.968704067404566, 8.840358974788511, 400.0],
[49.61903026968014, 9.29528199847166, 300.0]]
[25]:
map = folium.Map(location=(yAvgW,xAvgW)
,tiles='CartoDB Positron' #'OpenStreetMap'
,zoom_start=11
)
HeatMap(heatMapData,name='Heat Map von MIS_BEHAEL Radius 10 Größe 5',radius=10,blur=5,base=True).add_to(map)
[25]:
<folium.plugins.heat_map.HeatMap at 0x1c7894c9cd0>
[26]:
shpLeitungen[~pd.isnull(shpLeitungen['geometry'])].sort_values(by=['DN'],ascending=True).explore(column='DN'
,cmap='cool_r',vmin=shpLeitungen['DN'].quantile(.20),vmax=shpLeitungen['DN'].quantile(.80)
#,legend=False
,style_kwds={"style_function":lambda x: {"weight":min(max(x["properties"]["DN"]*facWidthinPixelDN,minWidthinPixel),maxWidthinPixel)}}
#,tiles='CartoDB Positron' #'OpenStreetMap'
,name='shpLeitungen'
,m=map
)
gdfUe1[['MITGLIEDSN','MIS_UGSTID','MIS_BEHAEL','geometry']].explode().sort_values(by=['MIS_BEHAEL'],ascending=False).explore(column='MIS_BEHAEL'
,cmap='autumn_r',vmin=gdfUe1["MIS_BEHAEL"].quantile(.025),vmax=gdfUe1["MIS_BEHAEL"].quantile(.975)
#,legend=False
,style_kwds={"style_function":lambda x: {"radius":min(max(x["properties"]["MIS_BEHAEL"]*facRadius,minRadius),maxRadius)}}
#,tiles='CartoDB Positron' #'OpenStreetMap'
,name='shpUebergabestellen'
,m=map
)
dummy=folium.LayerControl().add_to(map)
=== Kartenbeispiel¶
[27]:
map
[27]:
Make this Notebook Trusted to load map: File -> Trust Notebook